void VectorAngles (const float *forward, float *angles)
{
if(!forward[1]==0 && !forward[0]==0)
{
float tmp = sqrt(forward[0]*forward[0]+forward[1]*forward[1]);
angles[0] =(float)(atan2(forward[2],tmp)*180.0f/3.141592);
angles[1] = (float)(atan2(forward[1],forward[0])*180.0f/3.141592);
angles[2] = 0;
}
}

bool PathFree(float* from,float* to)
{
pmtrace_t *vis = gEngfuncs.PM_TraceLine(from, to, 0, 2, -1);   
return (vis->fraction == 1.0f);
}

void OriginAimbot::CalcFovangleAndVisibility(int ax)
{
int damage;
float targetspot[3];
PlayerInfo& r = vPlayers[ax];
if (me.team != vPlayers[ax].team)
{
damage = GetDamageVec(ax, targetspot, true);
if (damage)
{
r.visible = 2;
} else {
damage = GetDamageVec(ax, targetspot, false);
if (damage)
{
r.visible = 1;
} else {
r.visible = 0;
}
}
r.damage = damage;
r.damagespot[0] = targetspot[0];
r.damagespot[1] = targetspot[1];
r.damagespot[2] = targetspot[2];
}
}

//===================================================================================
void OriginAimbot::FindTarget ()
{
target =-1;
for (int ax = 0; ax < vPlayers.size(); ax++)
{
if (vPlayers[ax].getPVS() && vPlayers[ax].visible && me.team != vPlayers[ax].team)
{
target = ax;
}
}
}

int OriginAimbot::GetDamageVec(int ax, float *targetspot, bool onlyvis)
{
int hitdamage, penetration = WALL_PEN0, bullettype, damage;
vec3_t vecEnd, up, right, forward, EntViewOrg, PlayerOrigin, playerAngles;
float distance, wallpierce, defaultvec[3] = {0,0,0};
vector<aimvec>::iterator si, end;
PlayerOrigin = vPlayers[ax].getEnt()->origin;
if (vPlayers[ax].getEnt()->curstate.usehull == 0)
{
if (AimVecsS.size() > 0)
{
si = AimVecsS.begin();
end = AimVecsS.end();

defaultvec[0] = AimVecsS[0].h;
defaultvec[1] = AimVecsS[0].f;
defaultvec[2] = AimVecsS[0].r;
}
}
else
{
if (AimVecsD.size() > 0)
{
si = AimVecsD.begin();
end = AimVecsD.end();

defaultvec[0] = AimVecsD[0].h;
defaultvec[1] = AimVecsD[0].f;
defaultvec[2] = AimVecsD[0].r;
}
}
if (vPlayers[ax].getEnt()->curstate.gaitsequence == 6)
{
if (AimVecsJ.size() > 0)
{
si = AimVecsJ.begin();
end = AimVecsJ.end();

defaultvec[0] = AimVecsJ[0].h;
defaultvec[1] = AimVecsJ[0].f;
defaultvec[2] = AimVecsJ[0].r;
}
}
playerAngles[0]=0;
playerAngles[1]=vPlayers[ax].getEnt()->angles[1];
playerAngles[2]=0;
    gEngfuncs.pfnAngleVectors(playerAngles, forward, right, up);
forward[2] = -forward[2];
if (!onlyvis && cvar.autowall)
{
penetration = playerItems.CurPenetration();
}
bullettype = playerItems.CurBulletType();
damage = playerItems.CurDamage();
distance = playerItems.CurDistance();
wallpierce = playerItems.CurWallPierce();
for (;si!=end;++si)
{
targetspot[0] = PlayerOrigin[0] + up[0] * si->h + forward[0] * si->f + right[0] * si->r;
targetspot[1] = PlayerOrigin[1] + up[1] * si->h + forward[1] * si->f + right[1] * si->r;
targetspot[2] = PlayerOrigin[2] + up[2] * si->h + forward[2] * si->f + right[2] * si->r;
hitdamage = CanPenetrate(me.pmEyePos, targetspot, distance, penetration, bullettype, damage, wallpierce);
if (hitdamage > 0)
return hitdamage;
}
targetspot[0] = PlayerOrigin[0] + up[0] * defaultvec[0] + forward[0] * defaultvec[1] + right[0] * defaultvec[2];
targetspot[1] = PlayerOrigin[1] + up[1] * defaultvec[0] + forward[1] * defaultvec[1] + right[1] * defaultvec[2];
targetspot[2] = PlayerOrigin[2] + up[2] * defaultvec[0] + forward[2] * defaultvec[1] + right[2] * defaultvec[2];
return CanPenetrate(me.pmEyePos, targetspot, distance, penetration, bullettype, damage, wallpierce);
}

void OriginAimbot::CalcViewAngles()
{
float vec_to_target[3];
vec_to_target[0] = vPlayers[target].damagespot[0] - me.pmEyePos[0];
vec_to_target[1] = vPlayers[target].damagespot[1] - me.pmEyePos[1];
vec_to_target[2] = vPlayers[target].damagespot[2] - me.pmEyePos[2];
VectorAngles(vec_to_target,aim_viewangles);
aim_viewangles[0] *= -1;
if (aim_viewangles[0]>180)
{
aim_viewangles[0]-=360;
}
if (aim_viewangles[1]>180)
{
aim_viewangles[1]-=360;
}
}